package com.loong.web.suppert.collection.valid;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;

/**
 * 错误信息集合
 *
 * @author 张成轩
 */
public class ErrorList {

	/** 错误信息集合 */
	private LinkedList<ErrorInfo> errors;

	/**
	 * @return 获取错误信息
	 */
	public List<ErrorInfo> getErrors() {

		if (errors == null)
			errors = new LinkedList<ErrorInfo>();
		return errors;
	}

	/**
	 * @return 获取第一个错误信息
	 * @throws NoSuchElementException 不存在错误
	 */
	public ErrorInfo firstError() throws NoSuchElementException {

		return errors.getFirst();
	}

	/**
	 * @return 获取最后一个错误信息
	 * @throws NoSuchElementException 不存在错误
	 */
	public ErrorInfo lastError() throws NoSuchElementException {

		return errors.getLast();
	}

	/**
	 * @param error 错误信息
	 */
	public void addError(String error) {

		getErrors().add(new ErrorInfo(error));
	}

	/**
	 * @param field 字段
	 * @param error 错误信息
	 */
	public void addError(String field, String error) {

		getErrors().add(new ErrorInfo(field, error));
	}

	/**
	 * @param error 错误信息
	 */
	public void addError(ErrorInfo error) {

		getErrors().add(error);
	}

	/**
	 * @param errors 错误信息集合
	 */
	public void addErrors(Collection<ErrorInfo> errors) {

		getErrors().addAll(errors);
	}

	/**
	 * @return 是否包含错误
	 */
	public boolean hasError() {

		return errors != null && !errors.isEmpty();
	}

	@Override
	public String toString() {

		if (!hasError())
			return null;
		StringBuilder sb = new StringBuilder();
		for (ErrorInfo error : getErrors())
			sb.append("[").append(error.getError()).append("]");
		return sb.toString();
	}

	/**
	 * 错误信息
	 *
	 * @author 张成轩
	 */
	public static class ErrorInfo {

		private String field;
		private String error;

		/**
		 * @param field 字段
		 * @param error 错误
		 */
		public ErrorInfo(String field, String error) {

			this.field = field;
			this.error = error;
		}

		/**
		 * @param error 错误
		 */
		public ErrorInfo(String error) {

			this.error = error;
		}

		/**
		 * @return 错误
		 */
		public String getError() {

			return error;
		}

		/**
		 * @return 字段
		 */
		public String getField() {

			return field;
		}
	}
}
